package cn.itsource.controller;

import org.apache.commons.io.FilenameUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@RestController
public class UploadDownloadController {
    @Value("${file.path}")
    private String uploadPath;

    /**
     * 上传附件
     * @param name
     * @param headImage
     * @throws IOException
     */
    @PostMapping("/upload")
    public void upload(String name, MultipartFile headImage) throws IOException {
//        //获取mime类型(获取文件类型)
//        System.out.println(headImage.getContentType());
//        //获取文件大小
//        System.out.println(headImage.getSize());
//
//        //获取附件名
//        String filename = headImage.getOriginalFilename();
//        System.out.println(filename);
        //随机生成的名字   23423423342.jpg
        String fileName = System.currentTimeMillis() + "."
                + FilenameUtils.getExtension(headImage.getOriginalFilename());
        //创建一个file对象  D:/upload/23423423342.jpg
        File file = new File(uploadPath, fileName);
        //如果父文件夹不存在，则创建
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        //把附件转为字节输入流
        InputStream inputStream = headImage.getInputStream();

        //创建字节输出流
        FileOutputStream fos = new FileOutputStream(file);
        //上传核心代码
        IOUtils.copy(inputStream,fos);

        //关闭io流
        fos.close();
        inputStream.close();
    }

    /**
     *
     * @param response  http协议的响应对象，虽然它是接口，但是不用管，它底层会自动注入值
     * @throws FileNotFoundException
     */
    @GetMapping("/download")
    public void download(HttpServletResponse response) throws IOException {
        //设置mime类型，告诉程序，我是以流的方式向外输出
        response.setContentType("application/octet-stream");
        // 设置附件名   attachment; 下载以弹框的形式
        response.setHeader("Content-Disposition", "attachment; fileName="+URLEncoder.encode("中国人.webp","UTF-8")); //设置附件名
        //创建字节输入流
        FileInputStream fis = new FileInputStream(new File("D:/upload/1714353497649.webp"));
        //获取输出流(流向浏览器)
        ServletOutputStream outputStream = response.getOutputStream();
        //下载核心代码（浏览器默认情况：如果下载的附件是能被浏览器直接打开，它不会选择下载，它会选择直接通过浏览打开）
        IOUtils.copy(fis,outputStream);
        outputStream.close();
        fis.close();
    }
}
